package com.mt.eor;

/**
 * @ClassNameFindNumber
 * @Description
 * 1. 一个数组中有一种数出现奇数次，其它数都出现偶数次，找到这种数并打印出来
 * 2. 一个数组中有两种数出现奇数次，其它数都出现偶数次，找到这种数并打印出来
 * @Author
 * @Date2021/7/3 下午2:25
 * @Version V1.0
 **/
public class FindNumber {

    //arr中， 只有一种数出现奇数次
    public static void printOdd(int[] arr){
        int eor = 0;
        for (int i =0;i<arr.length;i++){
            eor ^= arr[i] ;
        }
        System.out.println(eor);
    }

    //arr中， 有两种数出现奇数次
    public static void printOddTwo(int[] arr){
        int eor = 0;
        for (int i =0;i<arr.length;i++){
            eor ^= arr[i] ;
        }
        int rightOne = eor&(~eor+1);
        int onlyOne = 0;
        for (int i =0;i<arr.length;i++){
            if ((arr[i] & rightOne) != 0){
                onlyOne ^= arr[i];
            }
        }
        System.out.println(onlyOne +" "+ (eor ^ onlyOne));
    }

    public static void main(String[] args) {
        int arr[]={1,1,1,1,2,2,2,3,3,3,3,4,4,4,4};
        printOdd(arr);
        int arrTow[]={1,1,1,1,2,2,2,3,3,3,3,4,4,4,4,5,5,5};
        printOddTwo(arrTow);
    }
}
